/*
 * 不知不觉当中，我们就到了最后一种设计模式，即访问者模式。访问者模式，听上去复杂一些。
 *
 * 但是，这种模式用简单的一句话说，就是不同的人对不同的事物有不同的感觉。
 *
 * 比如说吧，豆腐可以做成麻辣豆腐，也可以做成臭豆腐。可是，不同的地方的人未必都喜欢这两种豆腐。
 *
 * 四川的朋友可能更喜欢辣豆腐，江浙的人就可能对臭豆腐更喜欢一些。那么，这种情况应该怎么用设计模式表达呢？
 */
typedef struct tofu
{
	int type;

	void (*eat)(struct visitor * pvisitor, struct tofu * ptofu);
}tofu;

typedef struct visitor
{
	int region;

	void (*process)(struct tofu * ptofu, struct visitor * pvisitor);
}

/*
 * 就是这样一个豆腐，eat的时候就要做不同的判断了
 */
void eat(struct visitor * pvisitor, struct tofu * ptofu)
{
	assert(NULL != pvisitor && NULL != ptofu);
	pvisitor->process(ptofu, pvisitor);
}

/*
 * 既然eat的操作最后还是靠不同的visitor来处理了，那么下面就该定义process函数了
 */
void process(struct tofu * ptofu, struct visitor * pvisitor)
{
	assert(NULL != ptofu && NULL != pvisitor);

	if (ptofu->type == SPICY_FOOD && pvisitor->region == WEST ||
		ptofu->type == STRONG_SMELL_FOOD && pvisitor->region == EAST) {
		printf("I like this food!\n");
	}

	printf("I hate this food!\n");
}